"""
配置管理模块

作者：修炼者 (7457222@qq.com)
日期：2024-12-10
说明：
    处理应用配置的加载和验证。
"""
import os
import json
from typing import Dict, Any

def load_config(filename: str) -> Dict[str, Any]:
    """
    从JSON文件加载配置
    
    Args:
        filename: 配置文件路径
        
    Returns:
        包含配置信息的字典
    """
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            config = json.load(f)
        return validate_config(config)
    except Exception as e:
        raise ValueError(f"Failed to load config file: {str(e)}")

def validate_config(config: Dict[str, Any]) -> Dict[str, Any]:
    """
    验证配置数据
    
    Args:
        config: 配置字典
        
    Returns:
        验证后的配置字典
    """
    # 设置默认值
    defaults = {
        'HOST': '127.0.0.1',
        'PORT': 5000,
        'DEBUG': True,
        'LOG_LEVEL': 'INFO',
        'LOG_FILE': 'jygt_coder.log',
        'TEMPLATE_DIR': 'templates',
        'STATIC_DIR': 'static',
        'MAX_CONTENT_LENGTH': 16 * 1024 * 1024,  # 16MB
        'SECRET_KEY': os.urandom(24).hex(),
    }
    
    # 合并用户配置和默认配置
    validated = defaults.copy()
    validated.update(config)
    
    # 类型转换和验证
    try:
        validated['PORT'] = int(validated['PORT'])
        validated['DEBUG'] = bool(validated['DEBUG'])
        validated['MAX_CONTENT_LENGTH'] = int(validated['MAX_CONTENT_LENGTH'])
    except (ValueError, TypeError) as e:
        raise ValueError(f"Invalid config value: {str(e)}")
    
    # 验证必需的目录
    for dir_key in ['TEMPLATE_DIR', 'STATIC_DIR']:
        if not os.path.exists(validated[dir_key]):
            os.makedirs(validated[dir_key], exist_ok=True)
    
    return validated

def get_env_config() -> Dict[str, Any]:
    """
    从环境变量获取配置
    
    Returns:
        包含配置信息的字典
    """
    config = {}
    
    # 从环境变量读取配置
    env_mappings = {
        'JYGT_HOST': 'HOST',
        'JYGT_PORT': 'PORT',
        'JYGT_DEBUG': 'DEBUG',
        'JYGT_LOG_LEVEL': 'LOG_LEVEL',
        'JYGT_LOG_FILE': 'LOG_FILE',
        'JYGT_TEMPLATE_DIR': 'TEMPLATE_DIR',
        'JYGT_STATIC_DIR': 'STATIC_DIR',
        'JYGT_MAX_CONTENT_LENGTH': 'MAX_CONTENT_LENGTH',
        'JYGT_SECRET_KEY': 'SECRET_KEY',
    }
    
    for env_key, config_key in env_mappings.items():
        if env_key in os.environ:
            config[config_key] = os.environ[env_key]
    
    return validate_config(config)